一.IO流体系
   字节流体系
      OutputStream (抽象类)
         FileOutputStream 向文件写字节输出流
      BufferedOutputStream 高效字节输出流

	  InputStream
         FileInputStream 从文件中读取字节
      BufferedInputStream 高效字节输入流
   字符流体系
      Writer
		OutputStreamWriter:OutputStreamWriter 是字符流通向字节流的桥梁可使用指定的 charset 将要写入流中的字符编码成字节
              FileWriter 向文件中写字符输出流
      BufferedWriter 高效字符输出流

      Reader
	    InputStreamReader:InputStreamReader 是字节流通向字符流的桥梁它使用指定的 charset 读取字节并将其解码为字符
           FileReader 从文件中读字符
      BufferedReader 高效字符输入流
二.码表(字符集):charset 其实是一张字节和字符的映射表
   10101010 =>8bit=>1byte
   97 => a
   ASCII码表:美国标准信息交换码 a~z,A~Z 1个ASCII字符占用1byte,不识别中文
	(GB2312)GBK:中国制作的码表,字节和中文的映射表,1个中文占用2个字节
               假设: 1010 0111 1100 0010 => 2byte => '你'
		            1001 0111 1100 0010 => 2byte => '好'
    Unicode: 万国码(统一码) 编码全世界字符
		UTF-16:所有的字符统一使用两个字节编码(包括ASCII码也使用2byte)
		UTF-8:变长字节编码, 使用1~4字节去编码
              ASCII码=>1byte
              中文 =>大部分3byte
    ISO8859-1(latin1):西欧语言编码 对ASCII码表进行拓展,添加了一些字符,但是每个字符依然占用1byte

    *1.所有的码表都兼容ASCII码表,除了UTF-16之外,所有码表ASCII码字符都占用1byte
    *2.UTF-8,UTF-16,GBK都能识别中文

   编码(encode):字符=编码成>字节
   解码(decode):字节=解码成>字符
三.FileWriter类
	/**
	 * FileWriter类
	 * 构造方法:
	 *  FileWriter(String fileName):构造方法执行完会根据路径创建一个空白文件,如果该文件在硬盘已经存在会清空文件内容
	 *           根据给定的文件名构造一个 FileWriter 对象。
	 * 成员方法:
	 *   void write(int c): FileWriter底层会使用字符数组缓冲,将内容先写入到字符数组中,我们需要通过刷新将内容刷新到文件中
	 *                      close()方法:会先刷新在关流释放资源
	 *           写入单个字符。
	 *   void write(char[] cbuf)
	 *           写入字符数组。
	 *   write(char[] cbuf, int off, int len)
	 *           写入字符数组的某一部分。
	 *
	 *   void write(String str)
	 *           写入字符串
	 */
四.FileReader类
	/**
	 * FileReader类:
	 * 构造方法:
	 *   FileReader(String fileName)
	 *           在给定从中读取数据的文件名的情况下创建一个新 FileReader。
	 *   int read()
	 *           读取单个字符。
	 */
	/**
	 * 成员方法:
	 *   int read(char[] cbuf)
	 *           将字符读入数组。
	 * String类中的方法:
	 *   String(char[] value)
	 *           将一个字符数组转换成一个字符串
	 *   String(char[] value, int offset, int count)
	 *           分配一个新的 String，它包含取自字符数组参数一个子数组的字符。
	 */
五.转化流:InputStreamReader,OutputStreamWriter,使用转换流为了指定码表
	/**
	 *  我们需要使用InputStreamReader来指定编码
	 *     InputStreamReader 是字节流通向字符流的桥梁：它使用指定的 charset 读取字节并将其解码为字符
	 *  InputStreamReader(InputStream in, String charsetName)
	 *           创建使用指定字符集的 InputStreamReader。
	 *
	 *   new FileReader("day24_Charset/readUTF-8.txt");
	 *   相当于:new InputStreamReader(new FileInputStream("day24_Charset/readUTF-8.txt"),"GBK")
	 */
	/**
	 * 在IDEA开发工具下,使用的默认编码其实就是project encoding指定的编码,我们这里project encoding指定为GBK
	 * 因此默认码表就是GBK
	 * FileWriter:底层会使用平台默认码表进行写操作,默认码表roject encoding(GBK)
	 *
	 * 我们使用OutputStreamWriter解决向UTF-8文件写UTF-8字节问题:
	 *        OutputStreamWriter(OutputStream out, String charsetName)
	 *           创建使用指定字符集的 OutputStreamWriter。
	 * 解决乱码核心:保持数据编码和解码使用同一种码表
	 * FileWriter底层其相当于:new OutputStreamWriter(new FileOutputStream,"GBK")
	 */
五.高效字符流:BufferedWriter,BufferedReader
	/**
	 * BufferedWriter
	 * 构造方法:
	 *    BufferedWriter(Writer out)
	 *           创建一个使用默认大小输出缓冲区的缓冲字符输出流。
	 * 成员方法:
	 * void newLine()
	 *            它是一个跨平台方法,会根据不同的操作系统写入不同的换行符
	 *  void write(String str)
	 *           写入字符串。
	 * BufferedWriter:底层使用一个默认长度为8192的字符数组,利用BufferedWriter进行写动作
	 * 最终会将字符写入到BufferedWriter底层的字符数组中,所以最终我们需要通过刷新,将内容刷到文件中
	 *
	 *
	 */

	/**
	 * BufferedReader:高效字符输入流
	 * 构造方法:
	 * BufferedReader(Reader in)
	 *    创建一个使用默认大小输入缓冲区的缓冲字符输入流。
	 * 成员方法:
	 *   int read()
	 *       读取单个字符。
	 *    String readLine()
	 *       读取文件中一行数据,不包括每行末尾的换行符
	 * BufferedReader底层会使用默认长度为8192的字符数组作为缓冲区,通过BufferedReader调用read()方法
	 * 会将文件中的字符读取到底层默认长度为8192的字符数组中去,read()返回值其实都是从这个数组中的取得字符
	 */
六.高校字符流文本文件拷贝
	/**
	 * 利用BufferedReader和BufferedWriter拷贝文本文件
	 *  拷贝9.txt
	 */
	//method01();
			//1.利用BufferedReader和BufferedWriter关联源文件和目的文件
			BufferedReader br = new BufferedReader(new FileReader("day24/9.txt"));
			BufferedWriter bw = new BufferedWriter(new FileWriter("day24/9_copy_2.txt"));

			//2.利用readLine()方法读文件内容
			String line;
			while ((line = br.readLine()) != null) {
			bw.write(line);
			//bw.write("\r\n");//写入\r\n只针对windows换行有效
			bw.newLine();
			}
			//3.关流释放资源
			br.close();
			bw.close();
七.IO流标准异常处理方式
		FileReader fr=null;
		try{
		//fr = new FileReader("M:/day24/9.txt");
		fr=new FileReader("day24/9.txt");
		int ch=fr.read();
		System.out.println((char)ch);

		}catch(FileNotFoundException e){
		   e.printStackTrace();
		}catch(IOException e){
		   e.printStackTrace();
		}finally{
		 try{
		   if(fr!=null){
		    fr.close();
		}
		}catch(IOException e){
		  e.printStackTrace();
		}
	 }
